/*
显示器抽象层
*/
#include "display.h"

#include "st7735.h"

/**
 * @brief       显示字符串
 * @note        这是一个被依赖的抽象，请自行实现函数
 * @param       x :显示的位置的x坐标
 *      @arg       一般以
 * Display_spaced（宏定义的行距）的倍数来表示，如：2*Display_spaced
 * @param       y :显示的位置的y坐标
 * @param       str :要显示的字符串
 * @param       color :要显示的颜色(int)
 * @retval      None
 */
void displayStr(char *str, int x, int y, int color ) {
  // lcd_show_string(x,y,240,24,24,str,RED);
  // OLED_ShowString(x, y, str, 16, 0);
  ST7735_WriteString(x, y, str, FONT, ST7735_WHITE, ST7735_BLACK);
}

/// @brief 获取数字的位数
/// @param num 要获取位数的数字
/// @return 
static int getNumDigits(int32_t num) {
  int digits = 0;
  // 如果 num 是 0，它有一位
  if (num == 0) {
    return 1;
  }
  // 如果 num 是负数，先转为正数
  if (num < 0) {
    num = -num;
  }
  // 通过循环除以10来计算位数
  while (num > 0) {
    num /= 10;
    digits++;
  }
  return digits;
}
/**
 * @brief       显示数字
 * @note        这是一个被依赖的抽象，请自行实现函数
 * @param       x :显示的位置的x坐标
 * @param       y :显示的位置的y坐标
 *      @arg       一般以
 * Display_spaced（宏定义的行距）的倍数来表示，如：2*Display_spaced
 * @param       num ：要显示的数字
 * @retval      None
 * @date       2023/11/8
 * @note       支持了负数的显示，不过会把数字显示的位置往后移一格
 */
void displayNum(int32_t num, int x, int y ) {
  // lcd_show_num(x,y,num,5,24,RED);
  //int digits = getNumDigits(num);
  if (num >= 0) {
    ST7735_WriteString(x, y, " ", FONT, ST7735_WHITE, ST7735_BLACK);
    ST7735_WriteNum(x + FONT.width, y, num, 5, FONT, ST7735_WHITE, ST7735_BLACK);
  } else {
    ST7735_WriteString(x, y, "-", FONT, ST7735_WHITE, ST7735_BLACK);
    ST7735_WriteNum(x + FONT.width, y, -num, 5, FONT, ST7735_WHITE, ST7735_BLACK);
  }
}
/// @brief 
/// @param num 
/// @param x 
/// @param y 
/// @param len 
void displayNum_len(uint32_t num, int x, int y,int len)
{
  ST7735_WriteNum(x, y, num, len, FONT, ST7735_WHITE, ST7735_BLACK);
}

static void displaySignedNum(int32_t num, int x, int y,int len)
{
  if (num >= 0) {
    ST7735_WriteString(x, y, " ", FONT, ST7735_WHITE, ST7735_BLACK);
    ST7735_WriteNum(x + FONT.width, y, num, len, FONT, ST7735_WHITE, ST7735_BLACK);
  } else {
    ST7735_WriteString(x, y, "-", FONT, ST7735_WHITE, ST7735_BLACK);
    ST7735_WriteNum(x + FONT.width, y, -num, len, FONT, ST7735_WHITE, ST7735_BLACK);
  }
}
/**
 * @brief 显示浮点数
 * @param num 浮点数，固定小数点前三位和小数点后三位
 */
void displayFloat(float num,int x,int y)
{
  if (num >= 0) {
    displaySignedNum((int32_t)num ,x, y, 3);
    ST7735_WriteString(x + FONT.width * 4, y, ".", FONT, ST7735_WHITE, ST7735_BLACK);
    displaySignedNum(((int32_t)(num*1000))%1000, x + FONT.width * 5, y, 3);
  } else {
    displaySignedNum((int32_t)num, x, y, 3);
    ST7735_WriteString(x + FONT.width * 4, y, ".", FONT, ST7735_WHITE, ST7735_BLACK);
    displaySignedNum(((int32_t)(-num*1000))%1000, x + FONT.width * 5, y, 3);
  }
}
/**
 * @brief 在3*3个字大小的位置显示一个颜色块
 * 
 * @param x 
 * @param y 
 * @param color 
 */
void displayColor(uint16_t x, uint16_t y, uint16_t color) {
  ST7735_FillRectangle(x, y,3*FONT.width,3*FONT.height,color);
}

/// @brief 显示初始化 @note 这是一个被依赖的抽象，请自行实现函数
void display_Init() {
  ST7735_Init();
	displayClean();
}
/// @brief 清屏 @note 这是一个被依赖的抽象，请自行实现函数
void displayClean() { ST7735_FillScreen(ST7735_BLACK); }
/// @brief 清除某一行 
/// @param y 行的y坐标，以Display_spaced为单位
///@note 这是一个被依赖的抽象，请自行实现函数
void displayCleanLine(uint16_t y) { ST7735_FillRectangle(0, y, ST7735_WIDTH, Display_spaced, ST7735_BLACK); }
